﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using produccion.modulos;
using produccion.reportes;
using System.Windows.Input;
using System.Collections.Specialized;

namespace produccion.vistamodelo
{
    public class VMEstadisticasdeReparaciones : ViewModelBase, IDataErrorInfo
    {
        #region Campos
        private MDOgeneral _mod = new MDOgeneral();
        private CLSMAECLIP _cliente = new CLSMAECLIP();

        #endregion

        #region Constructor
        public VMEstadisticasdeReparaciones()
        {
            try
            {
                lisclientes = _cliente.listaClienteReparaciones();

                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }
                strTituloVentana = "Estadisticas de Reparaciones - Usuario: " + MDOgeneral.usuario + " - [FRMEstadisticasReparaciones]";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        #endregion

        #region Propiedades

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
        }

        private string _strTipo;
        public string strTipo
        {
            get { return _strTipo; }
            set 
            { 
                _strTipo = value; 
                base.OnPropertyChanged("strTipo");
                if (strTipo != null)
                {
                    if (strEstadistica != null)
                        logValido = true;
                    else
                        logValido = false;
                }
                else
                    logValido = false;
            }
        }

        private string _strEstadistica;
        public string strEstadistica
        {
            get { return _strEstadistica; }
            set 
            { 
                _strEstadistica = value; 
                base.OnPropertyChanged("strEstadistica");
                if (strEstadistica != null)
                {
                    if (strTipo != null)
                        logValido = true;
                    else
                        logValido = false;
                }
                else
                    logValido = false;
            }
        }

        private List<CLSMAECLIP> _lisclientes = new List<CLSMAECLIP>();
        public List<CLSMAECLIP> lisclientes
        {
            get { return _lisclientes; }
            set { _lisclientes = value; base.OnPropertyChanged("lisclientes"); }
        }

        private CLSMAECLIP _selcliente = new CLSMAECLIP();
        public CLSMAECLIP selcliente
        {
            get { return _selcliente; }
            set { _selcliente = value; base.OnPropertyChanged("selcliente"); }
        }

        private DateTime _dtmFechaInicial = DateTime.Now.AddYears(-100);
        public DateTime dtmFechaInicial
        {
            get { return _dtmFechaInicial; }
            set { _dtmFechaInicial = value; base.OnPropertyChanged("dtmFechaInicial"); }
        }

        private DateTime _dtmFechaFinal = DateTime.Now.Date;
        public DateTime dtmFechaFinal
        {
            get { return _dtmFechaFinal; }
            set { _dtmFechaFinal = value; base.OnPropertyChanged("dtmFechaFinal"); }
        }

        private DataTable _listado = new DataTable();
        public DataTable listado
        {
            get { return _listado; }
            set { _listado = value; base.OnPropertyChanged("listado"); }
        }

        private Boolean _logValido = false;
        public Boolean logValido
        {
            get { return _logValido; }
            set { _logValido = value; base.OnPropertyChanged("logValido"); }
        }

        #endregion

        #region Comandos

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {
                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(Salir);
                }
                return _cmdSalir;
            }
        }

        RelayCommand _cmdFiltrar;
        public ICommand cmdFiltrar
        {
            get
            {
                if (_cmdFiltrar == null)
                {
                    _cmdFiltrar = new RelayCommand(r => filtrar());
                }
                return _cmdFiltrar;
            }
        }

        RelayCommand _cmdImprimir;
        public ICommand cmdImprimir
        {
            get
            {
                if (_cmdImprimir == null)
                {
                    _cmdImprimir = new RelayCommand(r => imprimir());
                }
                return _cmdImprimir;
            }
        }

        RelayCommand _cmdLimpiar;
        public ICommand cmdLimpiar
        {
            get
            {
                if (_cmdLimpiar == null)
                {
                    _cmdLimpiar = new RelayCommand(r => limpiar());
                }
                return _cmdLimpiar;
            }
        }

        #endregion

        #region Metodos


        void filtrar()
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;

                string strClienteIni = "   ";
                string strClienteFin = "ZZZ";
                if (selcliente != null)
                {
                    if (selcliente.CODCLI_CLI != null)
                    {
                        strClienteIni = selcliente.CODCLI_CLI;
                        strClienteFin = selcliente.CODCLI_CLI;
                    }
                }


                MDOgeneral.spComando.CommandText = "SP_ESTADISTICASREP";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_tipo", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = strTipo;
                MDOgeneral.spComando.Parameters["pva_tipo"].Direction = ParameterDirection.Input;

                MDOgeneral.spComando.Parameters.Add("pva_tipo", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = strEstadistica;
                MDOgeneral.spComando.Parameters["pva_tipo"].Direction = ParameterDirection.Input;

                MDOgeneral.spComando.Parameters.Add("pva_cliini", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = strClienteIni;
                MDOgeneral.spComando.Parameters["pva_cliini"].Direction = ParameterDirection.Input;

                MDOgeneral.spComando.Parameters.Add("pva_clifin", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = strClienteFin;
                MDOgeneral.spComando.Parameters["pva_clifin"].Direction = ParameterDirection.Input;

                MDOgeneral.spComando.Parameters.Add("pdt_desde", Oracle.DataAccess.Client.OracleDbType.Date).Value = dtmFechaInicial.Date;
                MDOgeneral.spComando.Parameters["pdt_desde"].Direction = ParameterDirection.Input;

                MDOgeneral.spComando.Parameters.Add("pdt_hasta", Oracle.DataAccess.Client.OracleDbType.Date).Value = dtmFechaFinal.Date;
                MDOgeneral.spComando.Parameters["pdt_hasta"].Direction = ParameterDirection.Input;

                //Output
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();

                string query = "select CODCLI_TMP, NOMCLI_TMP, C1_TMP, C2_TMP, C3_TMP, C4_TMP, C5_TMP, C6_TMP, C7_TMP, C8_TMP from tmpestrep order by ORDEN_TMP ";
                listado = _mod.consulta(query);

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void limpiar()
        {
            try
            {
                selcliente = null;
                strTipo = null;
                strEstadistica = null;
                listado.Clear();
                dtmFechaInicial = DateTime.Now.AddYears(-100);
                dtmFechaFinal = DateTime.Now;
                logValido = false;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void imprimir()
        {
            try
            {
                DataSet ds = new DataSet("dsEstadisticas");

                DataTable dtEncabezado = new DataTable("dtEncabezado");
                DataTable dtDetalle = new DataTable("dtDetalle");
                DataTable dtTitulos = new DataTable("dtTitulos");

                #region Encabezado
                dtEncabezado.Columns.Add("Tipo", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("Informe", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("Cliente", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("FechaIni", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("FechaFin", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("STREMPRESA", System.Type.GetType("System.String"));

                DataRow drE = dtEncabezado.NewRow();
                if (strTipo == "S")
                    drE["Tipo"] = "Servicios";
                if (strTipo == "G")
                    drE["Tipo"] = "Garantias";
                if (strTipo == "R")
                    drE["Tipo"] = "Reconocidos";
                if (strTipo == "T")
                    drE["Tipo"] = "Todos";

                if (strEstadistica == "1")
                    drE["Informe"] = "Cliente / Referencia / Daño";
                if (strEstadistica == "2")
                    drE["Informe"] = "Cliente / Daño / Referencia";
                if (strEstadistica == "3")
                    drE["Informe"] = "Cliente / Referencia / Arreglo";
                if (strEstadistica == "4")
                    drE["Informe"] = "Cliente / Arreglo / Referencia";
                if (strEstadistica == "5")
                    drE["Informe"] = "Gestión de Eficiencia en Días";

                 if (selcliente != null)
                {
                    if (selcliente.CODCLI_CLI != null)
                    {
                        drE["Cliente"] = selcliente.NOMCLI_CLI;
                    }
                    else
                        drE["Cliente"] = "";
                }
                else
                    drE["Cliente"] = "";

                drE["FechaIni"] = dtmFechaInicial.ToString("dd//MM/yyyy");
                drE["FechaFin"] = dtmFechaFinal.ToString("dd//MM/yyyy");
                drE["STREMPRESA"] = MDOgeneral.strEmpresaImprime;

                dtEncabezado.Rows.Add(drE);

                #endregion

                #region Detalle
                    dtDetalle = listado;
                #endregion

                #region Titulos
                dtTitulos.Columns.Add("CODCLI_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("NOMCLI_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("C1_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("C2_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("C3_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("C4_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("C5_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("C6_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("C7_TMP", System.Type.GetType("System.String"));
                dtTitulos.Columns.Add("C8_TMP", System.Type.GetType("System.String"));

                DataRow drT = dtTitulos.NewRow();

                drT["CODCLI_TMP"] = "Cliente";
                drT["NOMCLI_TMP"] = "Nombre Cliente";

                if (strEstadistica == "1")
                {
                    drT["C1_TMP"] = "Ref.";
                    drT["C2_TMP"] = "Descripción";
                    drT["C3_TMP"] = "Cant.";
                    drT["C4_TMP"] = " % ";
                    drT["C5_TMP"] = "Daño";
                    drT["C6_TMP"] = "Descripción Daño ";
                    drT["C7_TMP"] = "Cant.";
                    drT["C8_TMP"] = " % ";
                }
                if (strEstadistica == "2")
                {
                    drT["C1_TMP"] = "Daño";
                    drT["C2_TMP"] = "Descripción Daño";
                    drT["C3_TMP"] = "Cant.";
                    drT["C4_TMP"] = " % ";
                    drT["C5_TMP"] = "Ref.";
                    drT["C6_TMP"] = "Descripción";
                    drT["C7_TMP"] = "Cant.";
                    drT["C8_TMP"] = " % ";
                }
                if (strEstadistica == "3")
                {
                    drT["C1_TMP"] = "Ref.";
                    drT["C2_TMP"] = "Descripción";
                    drT["C3_TMP"] = "Cant.";
                    drT["C4_TMP"] = " % ";
                    drT["C5_TMP"] = "Arreglo";
                    drT["C6_TMP"] = "Descripción Arreglo ";
                    drT["C7_TMP"] = "Cant.";
                    drT["C8_TMP"] = " % ";
                }
                if (strEstadistica == "4")
                {
                    drT["C1_TMP"] = "Arreglo";
                    drT["C2_TMP"] = "Descripción Arreglo";
                    drT["C3_TMP"] = "Cant.";
                    drT["C4_TMP"] = " % ";
                    drT["C5_TMP"] = "Ref.";
                    drT["C6_TMP"] = " Descripción";
                    drT["C7_TMP"] = "Cant.";
                    drT["C8_TMP"] = " % ";
                }
                if (strEstadistica == "5")
                {
                    drT["C1_TMP"] = "Reparación";
                    drT["C2_TMP"] = "Reparación";
                    drT["C3_TMP"] = "Ref.";
                    drT["C4_TMP"] = "Descripción";
                    drT["C5_TMP"] = "Orden";
                    drT["C6_TMP"] = "Recibido";
                    drT["C7_TMP"] = "Enviado";
                    drT["C8_TMP"] = "Días";
                }

                dtTitulos.Rows.Add(drT);
                #endregion

                dtEncabezado.TableName = "dtEncabezado";
                dtDetalle.TableName = "dtDetalle";
                dtTitulos.TableName = "dtTitulos";
                ds.Tables.Add(dtEncabezado);
                ds.Tables.Add(dtDetalle);
                ds.Tables.Add(dtTitulos);

                if (strEstadistica == "5")
                {
                    Vista vista = new Vista { ds = ds, reporte = @"reportes\rptEstadisticas2.rpt" };
                    vista.Show();
                }
                else
                {
                    Vista vista = new Vista { ds = ds, reporte = @"reportes\rptEstadisticas.rpt" };
                    vista.Show();
                }
                 
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void Salir(Object frmformulario)
        {
            ((Window)frmformulario).Close();
        }

        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

        /// <summary>
        /// Returns true if this object has no validation errors.
        /// </summary>
        /// 

        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                    if (GetValidationError(property) != null)
                        return false;
                return true;
            }
        }

        static readonly string[] ValidatedProperties = 
            { 
                "strTipo",
                "strEstadistica"
            };

        string GetValidationError(string propertyName)
        {
            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            string error = null;

            switch (propertyName)
            {
                case "strTipo":
                    error = this.ValidateTipo();
                    break;
                case "strEstadistica":
                    error = this.ValidateEstadistica();
                    break;
                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }
            return error;
        }

        string ValidateTipo()
        {
            try
            {
                if (strTipo == null) { return "Debe seleccionar un tipo de reparación"; }
                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        string ValidateEstadistica()
        {
            try
            {
                if (strEstadistica == null) { return "Debe seleccionar un tipo de estadistica para visualizar la consulta"; }
                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        

        #endregion

    }
}
